/**
 * 
 */
package renmopr.tourguide.config;

import com.jfinal.config.Constants;
import com.jfinal.config.Handlers;
import com.jfinal.config.Interceptors;
import com.jfinal.config.JFinalConfig;
import com.jfinal.config.Plugins;
import com.jfinal.config.Routes;
import com.jfinal.core.JFinal;
import com.jfinal.json.MixedJsonFactory;
import com.jfinal.kit.PropKit;
import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
import com.jfinal.plugin.druid.DruidPlugin;
import com.jfinal.template.Engine;
import com.jfinal.weixin.sdk.api.ApiConfig;
import com.jfinal.weixin.sdk.api.ApiConfigKit;

import renmopr.tourguide.controller.BackstageController;
import renmopr.tourguide.controller.WxController;
import renmopr.tourguide.dao.Photo;
import renmopr.tourguide.dao.Place;
import renmopr.tourguide.dao.PlaceNews;
import renmopr.tourguide.interceptor.CrosInterceptor;
import renmopr.tourguide.util.Consts;
import renmopr.tourguide.util.ExceptionInterceptor;

/**
 * @author opunc
 *
 */
public class Config extends JFinalConfig {
	
    public void configConstant(Constants me) {
//        PropKit.use(new File("/var/sample/config.cnf"));	// 非工程下文件用 new File
    	try {
    		PropKit.use("config_dev.cnf");
    	} catch(Exception e) {
    		PropKit.use("config.cnf");
    	}
    	me.setBaseUploadPath(Consts.UPLOAD_PATH);	// 修改上传文件位置（主要是因为放到生产环境下，项目被提交到tomcat时，原项目会被删除，那么之前用户的数据将丢失
        me.setDevMode(PropKit.getBoolean("devMode", false));	// 开启开发模式
        me.setJsonFactory(new MixedJsonFactory());
        // 微信用。ApiConfigKit 设为开发模式可以在开发阶段输出请求交互的 xml 与 json 数据
        ApiConfigKit.setDevMode(me.getDevMode());
    }

    public void configRoute(Routes me) {
    	me.add("/wx", WxController.class);
    	me.add("/bs", BackstageController.class);
    }

    public void configPlugin(Plugins me) {
		DruidPlugin dp = new DruidPlugin(PropKit.get("jdbcUrl"), PropKit.get("user"), PropKit.get("password"));
		me.add(dp);
		ActiveRecordPlugin arp = new ActiveRecordPlugin(dp);
		arp.setShowSql(PropKit.getBoolean("devMode", false));	// 显示 SQL语句
		me.add(arp);
		arp.addMapping("place", Place.class);
		arp.addMapping("photo", Photo.class);
        arp.addMapping("place_news", PlaceNews.class);
    }

    public void configInterceptor(Interceptors me) {
        // 设置默认的 appId 规则，默认值为appId，可采用url挂参数 ?appId=xxx 切换多公众号
        // ApiInterceptor.setAppIdParser(new AppIdParser.DefaultParameterAppIdParser("appId")); 默认无需设置
        // MsgInterceptor.setAppIdParser(new AppIdParser.DefaultParameterAppIdParser("appId")); 默认无需设置
        //me.add(new CrosInterceptor());
        me.add(new ExceptionInterceptor());	// 添加全局异常拦截
    }

    public void configHandler(Handlers me) {

    }

    public void afterJFinalStart() {
        // 1.5 之后支持redis存储access_token、js_ticket，需要先启动RedisPlugin
//        ApiConfigKit.setAccessTokenCache(new RedisAccessTokenCache());
        // 1.6新增的2种初始化
//        ApiConfigKit.setAccessTokenCache(new RedisAccessTokenCache(Redis.use("weixin")));
//        ApiConfigKit.setAccessTokenCache(new RedisAccessTokenCache("weixin"));

        ApiConfig ac = new ApiConfig();
        // 配置微信 API 相关参数
        ac.setToken(PropKit.get("token"));
        ac.setAppId(PropKit.get("appId"));
        ac.setAppSecret(PropKit.get("appSecret"));

        /**
         *  是否对消息进行加密，对应于微信平台的消息加解密方式：
         *  1：true进行加密且必须配置 encodingAesKey
         *  2：false采用明文模式，同时也支持混合模式
         */
        ac.setEncryptMessage(PropKit.getBoolean("encryptMessage", false));
        ac.setEncodingAesKey(PropKit.get("encodingAesKey", "setting it in config file"));

        /**
         * 多个公众号时，重复调用ApiConfigKit.putApiConfig(ac)依次添加即可，第一个添加的是默认。
         */
        ApiConfigKit.putApiConfig(ac);
    }

    public static void main(String[] args) {
        JFinal.start("src/main/webapp", 8080, "/", 5);
    }

	@Override
	public void configEngine(Engine engine) {

	}
}